#include <iostream>

using namespace std;

class A
{

private:
    string name;

public:
    A() : age(5) {}
    int age;

    friend void setName(A &, string);
    string getName(void)
    {
        return name;
    };
    void getNameByPoint(string *s)
    {
        *s = name;
    };
    void getNameByReference(string &s)
    {
        s = name;
    };
    void printt()
    {
        cout << "name " << name << age << endl;
    };
};
void setName(A &a, string i)
{
    a.name = i;
}

class fri1
{
    friend void setX(fri1 &, int);
    /*友元函数声明，setX是类fril的友元函数
      友元函数的声明可以出现在类的任何地方
      private、protected、public这些成员访问说明符标志与友元
      的声明无关，因此友元函数的声明可以出现在类的任何地方*/
public:
    fri1() : x(0)
    {
    }
    void printt()
    {
        cout << "fri1里的 x: " << x << endl;
    }

private:
    int x;
};

void setX(fri1 &f, int val)
{              //友元函数的定义
    f.x = val; //修改private数据
    //f.printt();//还可以访问成员函数
}

int main()
{
    fri1 friend1;
    cout << "创建fri1对象friend1, x的值为: ";
    friend1.printt();
    cout << endl;
    setX(friend1, 8);
    cout << "使用友元函数setX后，x的值为: ";
    friend1.printt();
    cout << endl;
    A a;
    setName(a, "张三");
    a.printt();
    string name = a.getName();
    cout << name << endl;
    string s, r;
    a.getNameByPoint(&s);
    a.getNameByReference(r);
    cout << s << r << endl;
    return 0;
}
